Skip to content

The MuTap-Max half of production-readiness M0: watchdog n on both externals' right outlets, MuTap re-pinned to main - #28

Merged
tap merged 2 commits into
mainfrom
feat/m0-watchdog-outlet
Oct 14, 2026
Merged

tap merged 2 commits into
mainfrom
feat/m0-watchdog-outlet

Conversation

@tap

@tap tap commented Oct 14, 2026

Copy link
Copy Markdown
Owner

The MuTap-Max half of production-readiness M0 (tap/MuTap#91; plan §3, rule 3: every library feature the external exposes lands with its attribute or message, maxref and help text, test row, and the submodule re-pin).

  • Re-pin submodules/MuTap 449cf6c → 9a27f2e (main: the watchdog, the namespace fix, PROTOCOL.md, v0.1.0, and Reverb behind the canceller: reverb_mix stage, Dattorro ASG vs wet/decay, dry-only-shift variant, dattorro_paper cost table (phase 2 item 7, part 1) MuTap#83–#90 in between), moved with the new scripts/repin.sh.
  • watchdog n on the rightmost outlet of mutap.afc~ (the canceller's trips plus the guard's) and mutap.aec~ (every engine's; a chain counts a stage's trip once), sent only when the count moves, from a pre-allocated atoms member on the audio thread. A healthy patch never hears it; a rebuild starts a fresh count. The affected block comes out as silence, as the library guarantees.
  • Tests (Min-level, mock kernel): a NaN in the microphone after 32 blocks → exactly one watchdog 1, no non-finite output sample, for the default afc engine, the guarded one (back to ARMING, counted once) and the aec engine; a healthy run sends none.
  • One re-recorded expectation. The @ceiling scenario measured "a lost-verdict duck and a release, no strike" at the previous pin. On main, lost_in_probation_strikes defaults on (howl_guard: a LOST in probation is a strike, default on (cabin's duck cycle); TwoMicSmoke honours MUTAP_SLOW_THREADS MuTap#88), so that duck at report 143 is one strike and the doubled re-arm timer keeps the guard ducked for the rest of the 12 s. The assertion is now "the detector never trips: at most one strike, and the guard opened (report 47) before it"; the comment records both pins' readings.
  • README (both objects), both maxrefs and both help patchers (a comment beside the right outlet's notes) describe the message.

Local: both Catch2 suites pass (20 cases; the afc suite 12.3 s on the Intel Mac); clang-tidy clean on the four TUs; universal build. Nothing has been exercised in a running Max, as before.

🤖 Generated with Claude Code

https://claude.ai/code/session_01DDhgJqxUsdmWPKh6pKrV5A

tap and others added 2 commits October 14, 2026 06:04
The production-readiness M0 tree (tap/MuTap#91): the NaN watchdog in
every hot path, the README namespace fix and snippet test, PROTOCOL.md,
v0.1.0, the claims table and the IP notices, plus everything between
449cf6c and main (tap/MuTap#83-#90: the reverb stages, the spectral
reverb, the guard's lost_in_probation_strikes default, the detector's
__restrict bank, TapHouse v7). Moved with scripts/repin.sh.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDhgJqxUsdmWPKh6pKrV5A
…he right outlet

The MuTap-Max half of production-readiness M0 (tap/MuTap#91, plan §3
rule 3). Each external keeps, per built engine, the last count it
reported — mutap.afc~ the canceller's pem_afc::watchdog_trips() plus
the guard's howl_guard::watchdog_trips(0), mutap.aec~ every engine's
watchdog_trips() (a chain counts a stage's trip once) — and sends
`watchdog n` on its rightmost outlet whenever the count moves, from a
pre-allocated atoms member on the audio thread; a healthy patch never
hears it, and a rebuild starts a fresh count. The affected block is one
block of silence, as the library guarantees.

Tests (Min-level, the mock kernel): a NaN in the microphone after 32
blocks yields exactly one `watchdog 1` and a cleaned output with no
non-finite sample, for the default afc engine, for the guarded one
(the guard goes back to ARMING; the trip counts once) and for the aec
engine; a healthy run sends none. The afc test's room gained a
`poison` flag; the aec test gained the room driver and the fifo-outlet
wait the afc test already had.

The @ceiling scenario's expectation is re-recorded under the new pin:
at the default ceiling the guard still opens (report 47) and the
detector never trips, but the lost-verdict duck at report 143 is now
ONE strike, since MuTap's lost_in_probation_strikes defaulted on
(tap/MuTap#88, after the previous pin), and the doubled re-arm timer
keeps it ducked for the rest of the 12 s; the assertion is now "at most
one strike, and the guard opened before it".

README (both objects), both maxrefs and both help patchers (a comment
beside the right outlet's existing notes) describe the message.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDhgJqxUsdmWPKh6pKrV5A
@tap
tap merged commit 674ad28 into main Oct 14, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant